﻿/* 
* Copyright (c) 2010, The University of Texas at Austin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, 
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, 
* this list of conditions and the following disclaimer in the documentation and/or other materials 
* provided with the distribution.
*
* Neither the name of The University of Texas at Austin nor the names of its contributors may be 
* used to endorse or promote products derived from this software without specific prior written 
* permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using System;
using System.Diagnostics;
using System.Text.RegularExpressions;
using Bio.Data.Interfaces.Drawing;

namespace Bio.Data.Providers.Structure.XRNA.Internal
{
    internal class XRNACircleShape : ICircleShape
    {
        public static XRNACircleShape Create(string xrnaLine)
        {
            if (xrnaLine != null)
            {
                if (Regex.IsMatch(xrnaLine, BPConnectorDefinition))
                {
                    string[] tokens = Regex.Split(xrnaLine, " ");
                    Debug.Assert(tokens.Length == 7);
                    double radius, thickness;
                    int filled;
                    if (Double.TryParse(tokens[3], out radius) &&
                        Double.TryParse(tokens[4], out thickness) &&
                        Int32.TryParse(tokens[5], out filled))
                    {
                        /*XRNACircleShape shape = new XRNACircleShape()
                        {
                            Filled = (filled == 1) ? true : false,
                            FillColor = ("#" + tokens[6]).PadRight(7, '0'),
                            EdgeColor = "#000000",
                            EdgeThickness = thickness,
                            Diameter = 2 * radius
                        };*/
                        XRNACircleShape shape = new XRNACircleShape()
                        {
                            Filled = (filled == 1) ? false : true,
                            FillColor = "#" + tokens[6].PadLeft(6, '0'),
                            EdgeColor = "#000000",
                            EdgeThickness = thickness,
                            Diameter = 2 * radius
                        };
                        return shape;
                    }
                }
                else if (Regex.IsMatch(xrnaLine, NTCircleSubstitutionDefinition))
                {
                    string[] tokens = Regex.Split(xrnaLine, " ");
                    Debug.Assert(tokens.Length == 7);
                    double radius, thickness;
                    int filled;
                    if (Double.TryParse(tokens[3], out radius) &&
                        Double.TryParse(tokens[4], out thickness) &&
                        Int32.TryParse(tokens[5], out filled))
                    {
                        XRNACircleShape shape = new XRNACircleShape()
                        {
                            Filled = (filled == 1) ? false : true,
                            FillColor = "#" + tokens[6].PadLeft(6, '0'),
                            EdgeColor = "#000000",
                            EdgeThickness = thickness,
                            Diameter = 2 * radius
                        };
                        return shape;
                    }
                }
            }
            return null; //Some error was encountered or this was not a valid line. In the future, we would probably throw an error to distinguish
        }

        #region ICircleShape Members

        public bool? Filled
        {
            get;
            set;
        }

        public string FillColor
        {
            get;
            set;
        }

        public double Diameter
        {
            get;
            set;
        }

        public double EdgeThickness
        {
            get;
            set;
        }

        public string EdgeColor
        {
            get;
            set;
        }

        #endregion

        #region Private Members and Methods

        private XRNACircleShape()
        {
        }

        private static string BPConnectorDefinition = @"!Bc\s\d+.\d{2}\s\d+.\d{2}\s\d+.\d{2}\s\d+.\d{2}\s\d\s[a-zA-Z0-9]+";
        private static string ArcDefinition = @"a(\s-?\d+.\d+){2}\s\d+.\d+\s\d+\s\d+.\d{2}\s\d+.\d{2}(\s\d+.\d{2}){2}\s\d\s[0-9a-fA-F]+";
        private static string NTCircleSubstitutionDefinition = @"!c\s\d+.\d{2}\s\d+.\d{2}\s\d+.\d{2}\s\d+.\d{2}\s\d\s[a-zA-Z0-9]+";

        #endregion
    }
}
